package models;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import net.sf.oval.constraint.Length;
import play.data.validation.Required;
import play.db.jpa.Model;

@Entity
public class Promo extends Model {
	
	private static final long serialVersionUID = -7553913995824337977L;
	
	private static final int DIAS_PARA_PROXIMO_ENVIO = 7;
	
	@Required
	private String nombre;
	
	@Required
	@Length(max=5000)
	@Column(length=5000, columnDefinition="text")
	private String descripcion;
	
	@OneToMany(cascade=CascadeType.ALL)
	private List<EnvioPromo> envioPromos = new ArrayList<EnvioPromo>();
	
	@ManyToOne
	private EstablecimientoAlimenticio establecimientoAlimenticio;
	
	public String getNombre() {
		return nombre;
	}
	
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	
	public String getDescripcion() {
		return descripcion;
	}
	
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
	public List<EnvioPromo> getEnvioPromos() {
		return envioPromos;
	}
	
	public void setEnvioPromos(List<EnvioPromo> envioPromos) {
		this.envioPromos = envioPromos;
	}
	
	public EstablecimientoAlimenticio getEstablecimientoAlimenticio() {
		return establecimientoAlimenticio;
	}
	
	public void setEstablecimientoAlimenticio(EstablecimientoAlimenticio establecimientoAlimenticio) {
		this.establecimientoAlimenticio = establecimientoAlimenticio;
	}
	
	public Boolean disponibleParaEnviar() {
		
		if (this.envioPromos.isEmpty()) {
			return Boolean.TRUE;
		}
		
		Calendar fechaProximoEnvio = Calendar.getInstance();
		
		fechaProximoEnvio.setTime(loadUltimoEnvio().getFechaEnviado());
		fechaProximoEnvio.add(Calendar.DATE, DIAS_PARA_PROXIMO_ENVIO);
		
		return Calendar.getInstance().getTime().after(fechaProximoEnvio.getTime());
	}
	
	public EnvioPromo loadUltimoEnvio() {
		
		if (this.getEnvioPromos().isEmpty()) {
			return null;
		}
		
		return this.getEnvioPromos().get( this.getEnvioPromos().size() - 1 );
	}
	
}
